// 给你一个包含 n 个整数的数组 nums，判断 nums 中是否存在三个元素 a，b，c ，
// 使得 a + b + c = 0 ？请你找出所有和为 0 且不重复的三元组。
// 注意：答案中不可以包含重复的三元组。

// 示例 1：
// 输入：nums = [-1,0,1,2,-1,-4]
// 输出：[[-1,-1,2],[-1,0,1]]

// 示例 2：
// 输入：nums = []
// 输出：[]

// 示例 3：
// 输入：nums = [0]
// 输出：[]

// 提示：
//     0 <= nums.length <= 3000
//     -105 <= nums[i] <= 105
/**
 * @param {number[]} nums
 * @return {number[][]}
 */

////双指针
var threeSum = function(nums) {
    let result = [];
    if (nums.length < 3) return result;
    nums.sort((a, b)=>{
        return a - b;
    });
    for(let i = 0; i < nums.length; i++) {
        if (nums[i] > 0) break;
        //经大佬思路，这里少了一个去重 比如-4 -1, -1, 0, 1, 2 中的 -1 0 1
        if (i > 0 && nums[i] === nums[i - 1]) {
            continue;
        }
        let L = i + 1;
        let R = nums.length - 1;
        while(L < R) {
            let sum = nums[i] + nums[L] + nums[R];
            if (sum === 0) {
                result.push([nums[i], nums[L], nums[R]]);
                //这里需要去重，因为可能L + 1的元素与L是相同的，那么同样三个数也等于0，与题意不符
                while(L < R && nums[L] === nums[L + 1]) {
                    L++;
                }
                while(L < R && nums[R] === nums[R - 1]) {
                    R--;
                }
                L++;
                R--;
            } else if(sum < 0) {
                L++;
            } else if(sum > 0) {
                R--;
            }
        }
    }
    return result;
};

console.log(threeSum([-1,0,1,2,-1,-4]));


